package com.taowan.xunbaozl.morning_speak.design_pattern.day08;

/**
 * 享元模式。
 * Created by diql on 2016/3/2.
 * 优点：
 * 降低资源负荷，且实现它并不需要修改大量代码
 * 缺点：
 * 提高了系统的复杂程度，增加了维护的困难，可能出错的由原来的一个对象变成三个：管理器，工厂，享元。
 * 数据的结构没有以前清晰，本来逻辑上同一处的数据现在分两处存储
 * 名词解释：
 * 内部状态：在享元对象内部不随外界环境改变而改变的共享部分。
 * 外部状态：随着环境的改变而改变，不能够共享的状态就是外部状态。
 *
 * Flyweight: 抽象享元类。所有具体享元类的超类或者接口，通过这个接口，Flyweight可以接受并作用于外部专题
 * ConcreteFlyweight: 具体享元类。指定内部状态，为内部状态增加存储空间。
 * UnsharedConcreteFlyweight: 非共享具体享元类。指出那些不需要共享的Flyweight子类。
 *
 * FlyweightFactory: 享元工厂类。用来创建并管理Flyweight对象，
 * 它主要用来确保合理地共享Flyweight，
 * 当用户请求一个Flyweight时，
 * FlyweightFactory就会提供一个已经创建的Flyweight对象或者新建一个（如果不存在）。
 */
public class Test {
    public static void main(String[] args) {
        Bird bird = FlyweightFactory.getBird(1);
        bird.getWeight();

        Bird bird2 = FlyweightFactory.getBird(2);
        bird2.getWeight();

        Bird bird3 = FlyweightFactory.getBird(2);
        bird3.getWeight();

        Bird bird4 = FlyweightFactory.getBird(3);
        bird4.getWeight();

        Bird bird5 = FlyweightFactory.getBird(3);
        bird5.getWeight();

        Bird bird6 = FlyweightFactory.getBird(3);
        bird6.getWeight();

        FlyweightFactory.allBird();
    }
}
